#pragma once
#include <unistd.h>
#include "data.hpp"

extern cloud::DataManager* _data; //声明一个外部变量

namespace cloud
{
  class HotManager
  {
  private:
    std::string _back_dir; //文件存储路径
    std::string _pack_dir; //压缩文件存储路径
    std::string _pack_suffix; //压缩文件后缀
    int _hot_time; //判断是否为热点文件间隔时间
  public:
    HotManager()
    {
      Config* conf = Config::_get_instance();
      _back_dir = conf->GetBackDir();
      _pack_dir = conf->GetPackDir();
      _pack_suffix = conf->GetArcSuffix();
      _hot_time = conf->GetHotTime();
      FileUtil fu1(_back_dir);
      FileUtil fu2(_pack_dir);
      //如果指定目录不存在则创建该目录
      fu1.CreateDirectory();
      fu2.CreateDirectory();
    }
  
    //判断该文件是否是热点文件
    //热点文件:当前时间 - 该文件的最后访问时间 > _hot_time
    bool HotJudge(const BackupInfo& info)
    {
      return time(nullptr) - info.atime > _hot_time;
    }

    bool RunModule()
    {
      while(1)
      {
        //1.遍历获得备份文件
        FileUtil fu1(_back_dir);
        std::vector<std::string> arr;
        fu1.ScanDirectory(arr);
        //2.判断该文件是否是热点文件
        for(auto& e : arr)
        {
          BackupInfo info;
          //如果该文件不存在_table里面,将其先添加到_table
          if(_data->GetOneByRealPath(e, info) == false)
          {
            info.InitBackupInfo(e);
          }
          //3.对热点文件进行压缩,并将源文件删除
          if(HotJudge(info))
          {
            FileUtil fu2(e);
            fu2.Compress(info.pack_path);
            fu2.Remove();
            //4.更新备份信息
            info.pack_flag = true;
            _data->Updata(info);  
          }
        }
      }
      std::cout << "cloud::HotManager.RunModule() is running...\r";
      usleep(3000); //每隔3s执行一次
      return true;
    }
  };
}
